

package futbol.tacticas.concursantes2007.CFTiorosko;

import futbol.General;
import futbol.tacticas.*;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;
import java.lang.Math;
/**
 *
 * @author tiorosko
 */
public class TacticaTiorosko implements Tactica{
    
    private int nValores[][]={
        {-150,0,8},  // Jugador 1[0]
        {-120,-75,6},  // Jugador 2[1]
        {-100,-25,8},  // Jugador 3[2]
        {-100,25,8},  // Jugador 4[3]
        {-120,75,6},  // Jugador 5[4]
        {-60,0,5},  // Jugador 6[5]
        {0,-50,7},  // Jugador 7[6]
        {70,0,7},  // Jugador 8[7]
        {100,-50,6},  // Jugador 9[8]
        {120,0,6},  // Jugador 10[9]
        {100,50,8} // Jugador 11[10]
    };

    public String getNombre(){
        return "C.F. Tiorosko";
    }
    
    public Color getColor1(){
        return Color.yellow;
    }
    
    public Color getColor2(){
        return Color.green;
    }
    
    public Color getColorNumero(){
        return Color.black;
    }
    
    public int getFuerza(int n){
        return nValores[n][2];
    }
    public int getXInicial(int n){
        return nValores[n][0];
    }
    
    public int getYInicial(int n){
        return nValores[n][1];
    }
    
    public Vector<Comando> getComandos(SituacionJugadores sj){
        
        
    Vector<Comando> com=new Vector();
        //Posicionamiento Inicial de los jugadores
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));

        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();
        
        Vector contra = new Vector();
        //Mejorar defensa
        if (!sj.estoyMasCercaDeBola() || bola.getX()<-55){
            for (int n=1;n<6;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
            
                    com.add(new ComandoIrA(n, contrarios[nJC].getX()-5, contrarios[nJC].getY()));
            }
            
        }
        
        //Mejorar medios
        if (!sj.estoyMasCercaDeBola() || ((bola.getX()>-55)&&(bola.getX()<30))){
            for (int n=6;n<8;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                
                    com.add(new ComandoIrA(n, contrarios[nJC].getX()-15, contrarios[nJC].getY()));
                    contra.add("" + nJC);
                
            }
            
        }
        
        //Mejorar extremos
        if (!sj.estoyMasCercaDeBola() || bola.getX()>30){
            for (int n=8;n<9;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                
                    com.add(new ComandoIrA(n, contrarios[nJC].getX()+5, contrarios[nJC].getY()));
                    contra.add("" + nJC);
                
            }
            contra.clear();
        }


        //Mejorar delanteros
        if (!sj.estoyMasCercaDeBola() || bola.getX()>30){
            for (int n=9;n<11;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                
                    com.add(new ComandoIrA(n, contrarios[nJC].getX()-20, contrarios[nJC].getY()));
                    contra.add("" + nJC);
                
            }
            contra.clear();
        }
        //Movimiento portero
        
        if (bola.getX()<-100 && bola.getY()>-75 && bola.getY()<75)
        {
          com.add(new ComandoIrA(0,bola.getX(), bola.getY()));
        }
        else
        {
             int y=(int)(bola.getY()/2);
            if (y<-20) y=-20;
            if (y>20) y=20;
        
          com.add(new ComandoIrA(0,nValores[0][0], y));  
        }
        
        
        
        Double ran = null;
        int nJug=sj.getMasCercanoDeBola();
        
        
       
        
        
         //Movimiento mas cercano a la bola
        if(nJug != 0)
        {
            com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        }

        lanzarBolaMejor(sj, com);
        
        return com;
    }
    
    
    private int heuristica(SituacionJugadores sj, int x, int y){
        int nHeu=y*5-x*100;
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,jugadores[n].getX(), jugadores[n].getY()));
            if (nDis<70)
                nHeu-=1000;
        }
        
        Point contrarios[]=sj.getContrario();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,contrarios[n].getX(), contrarios[n].getY()));
            if (nDis<70)
                nHeu+=1000;
        }
        return nHeu;
    }
    
    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        int nHeuMejor=9999999;
        int xMej=0, yMej=0;
        int x=0, y=0, nHeu;
        for (int n=0;n<50;n++){
            x=(int)(Math.random()*340)-170;
            y=(int)(Math.random()*240)-120;
            nHeu=heuristica(sj,x,y);
            if (nHeuMejor>nHeu){
                nHeuMejor=nHeu;
                xMej=x;
                yMej=y;
            }
        }
        
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            if (jugadores[n].getX()>-20 &&
                jugadores[n].getX()<130 
                    &&jugadores[n].getY()<80 
                    &&jugadores[n].getY()>-80 )
            {
                com.add(new ComandoTiroAPuerta(n, (int) ((-30 + Math.random() * 30))));

            }
            else
            {  
                com.add(new ComandoGolpearBola(n,xMej, yMej));
            }   
        }
    }

    
}
